/*
 * @Description: 常用混入文件
 */
import ResearchFormService from '@/api/domains/ResearchFormService';
import { showErrorMsg, validateMessage } from '@/api/utils/pc-message';
import {
  DICT_TYPE,
  COMPANY_CODE_LENGTH,
  DEFAULT_ARRAY_VALUE,
  PROVINCE_CODE
} from '@/utils/constants';
import { fromPairs, map } from 'lodash-es';
import { getStorageInfo } from '@/api/utils/storage-util';
import dayjs from 'dayjs';

// 获取字典数据
const { JCHY_DOMAIN_TYPE } = DICT_TYPE;

export default {
  data() {
    return {
      // 租户映射
      tenantMapping: {},
      // 租户
      tenant: '',
      // 规范参数列表
      normativeParamList: []
    };
  },

  methods: {
    /**
     * 获取区县数据
     * @param {Object} params 请求参数
     */
    async getDistrictCounty(params) {
      // 如果没有选择调研对象 则提示并阻止调用接口
      if(!params.companyName) {
        validateMessage('请先选择调研对象！');
        return;
      }
      try {
        // 获取区县数据 防止调用多个混入 service会覆盖原有的数据 这里直接使用
        const { data: { data } } = await new ResearchFormService().getContactPage(params);
        return data || [];
      } catch (error) {
        showErrorMsg(error);
      }
    },

    /**
     * 获取连带性规范性动作类型下拉数据
     */
    async getNormativeOptions() {
      try {
        // 获取关联性规范类型 防止调用多个混入 service会覆盖原有的数据 这里直接使用
        const data = await new ResearchFormService().getTenantList();
        // 获取所有关联性规范类型 并转换为下拉选项数据
        return this.conversionNormativeData(data);
      } catch (error) {
        showErrorMsg(error);
      }
    },

    /**
     * 获取当前登录人租户
     */
    async getAcquireTenants() {
      try {
        // 获取 决策会议系统公司编码类型 编码
        const data = await this.getNewDictData(JCHY_DOMAIN_TYPE);
        // 里面默认一条数据 默认获取第一条的children
        const dictionaryData = data[DEFAULT_ARRAY_VALUE].children;
        // 转换为字典映射 key为公司编码(默认只获取前八位) value为公司code;
        this.tenantMapping = fromPairs(map(dictionaryData, ({label, dictCode}) => [label.slice(0, COMPANY_CODE_LENGTH), dictCode]));
        // 获取当前登录人所在的公司编码(默认只获取前八位)
        const orgCode = getStorageInfo('orgCode');
        const newCompanyCode = orgCode.slice(0, COMPANY_CODE_LENGTH);
        // 通过公司编码获取公司code 如果没有则获取省公司code
        this.tenant = this.tenantMapping[newCompanyCode] || PROVINCE_CODE;
      } catch (error) {
        showErrorMsg(error);
      }
    },

    /**
     * 通过参数获取连带性规范性动作
     */
    async getNormativeParams() {
      try {
        const { formData: { researchStartDate } = {} } = this;
        const params = {
          year: dayjs(researchStartDate).year() // 获取开始时间的年份
        }
        // 通过年份参数获取规范性动作 防止调用多个混入 service会覆盖原有的数据 这里直接使用
        const { data: { data } } = await new ResearchFormService().getNormalityActionParams(params);
        this.normativeParamList = this.conversionNormativeData(data);
      } catch (error) {
        showErrorMsg(error);
      }
    },

    /**
     * 转换连带性规范性动作数据
     */
    conversionNormativeData(data) {
      return data?.map(({ specificRequirement, id }) => ({
        label: specificRequirement,
        value: id
      })) || [];
    }
  },
};
